package com.powerunion.datacollection.report.excelreport.config;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Element;

import com.powerunion.datacollection.report.excelreport.Logger;




/**
 * 报表配置信息管理对象，该类管理整个配置文件的所有配置信息，包括数据源配置信息，报表定义配置信息等等。
 * 外部需要查询任何用户定义的配置信息都通过该对象来取得。
 * @author juny 
 */
public class ReportConfigManager {
    private static Logger log = Logger.getLogger(ReportConfigManager.class);
    /*private static ReportConfigManager config = null;
    
    public static ReportConfigManager getConfigManager(String configFileName){
        if(null == config){
            config = new ReportConfigManager(configFileName);
        }
        return config;
    }*/
    
    /**
     * 构造一个报表配置信息管理对象。
     */
    public  ReportConfigManager(String configFileName){
        dataSources = new HashMap();
        reports = new HashMap();
        List errors = new ArrayList();
        try{
            org.dom4j.Document doc = XMLHelper.createSAXReader(configFileName, errors).read( new File(configFileName) );
            if(errors.size() > 0){
                //reprot error infomation.
                log.error("Couldn't load xml file!" + errors.toString() + " ReportConfigManager");
                return;
            }
            
            Element hmNode = doc.getRootElement();
            Iterator root = hmNode.elementIterator();
            String name = "";
            while (root.hasNext()){
                Element node = (Element)root.next();
                name = node.attributeValue("name");
                if(node.getName().equals(DataSourceConfig.DATASOURCE)){
                    DataSourceConfig source = new DataSourceConfig(name);
                    source.bindDataSource(node);
                    dataSources.put(name, source);
                }else if(node.getName().equals(ReportConfig.REPORT)){
                    ReportConfig report = new ReportConfig(this);
                    report.bindReport(node);
                    reports.put(name, report);
                }
            }
            
        }catch(Exception e){
           log.error(e.getMessage());
        }
    }
    
    /**
     * 根据传入的数据源名称获得该数据源对应的数据源配置信息对象。
     * @param dataSourceName	数据源名称
     * @return	数据源配置信息对象
     */
    public DataSourceConfig getDataSource(String dataSourceName){
        return (DataSourceConfig)dataSources.get(dataSourceName);
    }
    
    /**
     * 根据传入的报表名称获得该报表对应的配置信息对象。
     * @param reportName	报表名称
     * @return	非空 报表配置对象	<br>
     * 			否则 返回null
     */
    public ReportConfig getReport(String reportName){
        return (ReportConfig)reports.get(reportName);
    }
    
    /**
     * 设置报表模板文件的存放路径。
     * @param path
     */
    public void setTempletFilePath(String path){
        log.info("Templete file path: " + path);
        this.templetFilePath = path;
    }
    
    /**
     * 取得报表模板文件路径信息
     * @return
     */
    public String getTempletFilePath(){
        return this.templetFilePath;
    }
    
    public String toString(){
        StringBuffer ret = new StringBuffer();
        ret.append(" -----------Report system ----------------\n");
        ret.append(" dataSource: \n");
        ret.append(dataSources.toString());
        ret.append(" \n report: \n");
        ret.append(reports.toString());
        ret.append(" -------------end---------------------------");
        return ret.toString();
    }
    
    private Map dataSources = null;
    private Map reports = null;
    private String templetFilePath = "";
}
